package com.amumu.drama.common.modules.category.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.amumu.drama.common.base.api.CommonPage;
import com.amumu.drama.common.dto.GameTemplateDTO;
import com.amumu.drama.common.base.api.CommonResult;
import com.amumu.drama.common.constant.ProductTemplateTypeEnum;
import com.amumu.drama.common.modules.category.dto.GameQueryDto;
import com.amumu.drama.common.modules.category.dto.GameTemplateDto;
import com.amumu.drama.common.modules.category.dto.GameTemplateQueryDto;
import com.amumu.drama.common.modules.category.mapping.GameTemplateVoMapping;
import com.amumu.drama.common.modules.category.mapping.GameVoMapping;
import com.amumu.drama.common.modules.category.service.PmsProductTemplateService;
import com.amumu.drama.common.modules.category.vo.GameTemplateInfoVo;
import com.amumu.drama.common.modules.category.vo.GameTemplateVo;
import com.amumu.drama.common.modules.category.vo.GameVo;
import com.amumu.drama.mapper.PmsProductCategoryMapper;
import com.amumu.drama.mapper.PmsProductTemplateMapper;
import com.amumu.drama.model.PmsProductCategory;
import com.amumu.drama.model.PmsProductTemplate;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * @Auther: DM
 * @Date: 2024/6/27 15:18
 * @Description:
 */
@Service
@Log4j2
public class PmsProductTemplateServiceImpl extends ServiceImpl<PmsProductTemplateMapper, PmsProductTemplate> implements PmsProductTemplateService {

    @Autowired
    PmsProductTemplateMapper pmsProductTemplateMapper;

    @Autowired
    private PmsProductCategoryMapper pmsProductCategoryMapper;

    @Override
    public CommonResult<String> addOrUpdateGameTemplate(GameTemplateDto gameTemplateDto) {
        try {
            if (Objects.isNull(gameTemplateDto.getGameTemplateId())) {
                QueryWrapper<PmsProductTemplate> productTemplateQueryWrapper = new QueryWrapper<>();
                productTemplateQueryWrapper.eq("delete_status", 0);
                productTemplateQueryWrapper.eq("product_category_id", gameTemplateDto.getProductCategoryId());
                PmsProductTemplate pmsProductTemplate = pmsProductTemplateMapper.selectOne(productTemplateQueryWrapper);
                if (Objects.nonNull(pmsProductTemplate)) {
                    return CommonResult.failed("游戏模板名称重复");
                }
                QueryWrapper<PmsProductTemplate> pmsProductTemplateQueryWrapper = new QueryWrapper<>();
                pmsProductTemplateQueryWrapper.eq("product_category_id", gameTemplateDto.getProductCategoryId());
                pmsProductTemplateQueryWrapper.eq("delete_status", 0);
                PmsProductTemplate pmsProductTemplate1 = pmsProductTemplateMapper.selectOne(pmsProductTemplateQueryWrapper);
                if (Objects.nonNull(pmsProductTemplate1)) {
                    return CommonResult.failed("游戏已绑定模板");
                }
                PmsProductTemplate gameTemp = new PmsProductTemplate();
                BeanUtil.copyProperties(gameTemplateDto, gameTemp);
                gameTemp.setCreateTime(LocalDateTime.now());
                gameTemp.setType(ProductTemplateTypeEnum.CUSTOM.getCode());
                pmsProductTemplateMapper.insert(gameTemp);
                return CommonResult.success(gameTemp.getTemplateName());
            }
            PmsProductTemplate productTemplate = pmsProductTemplateMapper.selectById(gameTemplateDto.getGameTemplateId());
            if (Objects.isNull(productTemplate)) {
                return CommonResult.failed("游戏模板不存在");
            }
            if (!Objects.equals(productTemplate.getTemplateName(), gameTemplateDto.getTemplateName())) {
                QueryWrapper<PmsProductTemplate> pmsProductTemplateQueryWrapper = new QueryWrapper<>();
                pmsProductTemplateQueryWrapper.eq("template_name", gameTemplateDto.getTemplateName());
                pmsProductTemplateQueryWrapper.eq("delete_status", 0);
                PmsProductTemplate pmsProductTemplate1 = pmsProductTemplateMapper.selectOne(pmsProductTemplateQueryWrapper);
                if (Objects.nonNull(pmsProductTemplate1)) {
                    return CommonResult.failed("游戏模板名称重复");
                }
            }
            if (!Objects.equals(productTemplate.getProductCategoryId(), gameTemplateDto.getProductCategoryId())) {
                QueryWrapper<PmsProductTemplate> pmsProductTemplateQueryWrapper = new QueryWrapper<>();
                pmsProductTemplateQueryWrapper.eq("product_category_id", gameTemplateDto.getProductCategoryId());
                pmsProductTemplateQueryWrapper.eq("delete_status", 0);
                PmsProductTemplate pmsProductTemplate1 = pmsProductTemplateMapper.selectOne(pmsProductTemplateQueryWrapper);
                if (Objects.nonNull(pmsProductTemplate1)) {
                    return CommonResult.failed("游戏已绑定模板");
                }
            }
            BeanUtil.copyProperties(gameTemplateDto, productTemplate);
            productTemplate.setDirectChangeStatus(0);
            if (pmsProductTemplateMapper.updateById(productTemplate) < 1) {
                return CommonResult.failed("游戏模板修改失败");
            }
            return CommonResult.success();
        } catch (Exception e) {
            log.error("操作游戏模板失败", e);
            return CommonResult.failed("操作游戏模板失败 " + e.getMessage());
        }

    }

    @Override
    public CommonResult<String> deleteGameTemplate(Long gameTemplateId) {
        PmsProductTemplate template = pmsProductTemplateMapper.selectById(gameTemplateId);
        if (Objects.equals(template.getType(), ProductTemplateTypeEnum.DIRECT.getCode())) {
            return CommonResult.failed("直充模板不允许删除");
        }
        UpdateWrapper<PmsProductTemplate> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", gameTemplateId).set("delete_status", 1);
        if (!update(updateWrapper)) {
            return CommonResult.failed("删除游戏模板失败");
        }
        return CommonResult.success();
    }

    @Override
    public IPage<GameTemplateVo> pageGameTemplateList(GameTemplateQueryDto gameTemplateVo) {
        // 创建分页对象
        Page<GameTemplateDTO> page = new Page<>(gameTemplateVo.getPageNum(), gameTemplateVo.getPageSize());
        // 执行分页查询
        Page<GameTemplateDTO> page1 = pmsProductTemplateMapper.pageGameTemplateList(page, gameTemplateVo.getName(), gameTemplateVo.getTemplateName());
        // 将查询结果转换为gameVos列表
        List<GameTemplateVo> gameVos = GameTemplateVoMapping.INSTANCE.convertTo(page1.getRecords());
        // 创建一个新的IPage对象，用于存储转换后的结果
        IPage<GameTemplateVo> pmsProductCategoryIPage = new Page<>(gameTemplateVo.getPageNum(), gameTemplateVo.getPageSize(), page1.getTotal());
        pmsProductCategoryIPage.setRecords(gameVos);
        return pmsProductCategoryIPage;
    }

    @Override
    public CommonResult<GameTemplateInfoVo> getGameTemplateInfo(Long gameTemplateId) {
        GameTemplateInfoVo gameTemplateInfoVo = new GameTemplateInfoVo();
        PmsProductTemplate productTemplate = pmsProductTemplateMapper.selectById(gameTemplateId);
        if (Objects.isNull(productTemplate)) {
            return CommonResult.failed("游戏模板不存在");
        }
        BeanUtil.copyProperties(productTemplate, gameTemplateInfoVo);
        return CommonResult.success(gameTemplateInfoVo);
    }

    /**
     * 查询还未绑定的游戏列表
     *
     * @param gameQueryDto
     */
    @Override
    public CommonPage<GameVo> pageGameList(GameQueryDto gameQueryDto) {
        PageHelper.startPage(gameQueryDto.getPageNum(), gameQueryDto.getPageSize());
        List<PmsProductCategory> list = pmsProductCategoryMapper.pageGameList(gameQueryDto.getName());
        return CommonPage.restPageAndConvert(list, GameVoMapping.INSTANCE::convertTo);
    }

    /**
     * 解绑游戏模板
     *
     * @param gameTemplateId
     */
    @Override
    public CommonResult<String> unbindGame(Long gameTemplateId) {
        PmsProductTemplate template = pmsProductTemplateMapper.selectById(gameTemplateId);
        if (template == null) {
            return CommonResult.failed("模板不存在");
        }
        UpdateWrapper<PmsProductTemplate> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", gameTemplateId).set("product_category_id", null);
        if (!update(updateWrapper)) {
            return CommonResult.failed("游戏模板解绑失败");
        }
        return CommonResult.success();
    }
}
